/**
  ******************************************************************************
  * @file    delay.c
  * @author  TONLY
  * @version V1.0
  * @date    2022-01-01
  * @brief   滴答定时器
  ******************************************************************************
  * @attention
  * 
  *	本程序只供学习使用，未经作者许可，不得用于其它任何用途
  *	版权所有，盗版必究
  *
  * <h2><center>&copy; COPYRIGHT 2022 华清-TONLY </center></h2>
  ******************************************************************************
  */  
  
/* Includes ------------------------------------------------------------------*/
#include "delay.h"

/* Private variables ---------------------------------------------------------*/
static u8  	fac_us;			//us延时倍乘数			   
static u16 	fac_ms;			//ms延时倍乘数


/* Public functions ----------------------------------------------------------*/
/**
  * @brief  滴答定时器初始化
  * @param  None
  * @retval None
  */
void delay_init(void)
{	
	static u8 isDelayInit;
	if(isDelayInit)
		return;
	
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//不使能
	SysTick->CTRL&=~SysTick_CTRL_TICKINT_Msk;	//不中断
	SysTick->CTRL&=~SysTick_CTRL_CLKSOURCE_Msk;	//8分频
	fac_us = SystemCoreClock/8000000;
	fac_ms = SystemCoreClock/8000;
	
	isDelayInit = 1;
}


/**
  * @brief  微秒级别延时
  * @param  nus ： 微秒时间数(0-1864135)  
  * @note 	由于只有24个位共3个字节用来存储预装载值（0-16777215）
  			所以nus的取值范围为 0-(16777215/9) --为-- 0-1864135
  * @retval None	 
  */
void delay_us(u32 nus)
{
	u32 temp;
	
	SysTick->LOAD 	= nus*fac_us;							//设置预装载值
	SysTick->VAL	= 0x00;								//设置初始值
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;				//开启滴答定时器
	do{
		temp = SysTick->CTRL;
	}
	while((temp&SysTick_CTRL_ENABLE_Msk)&&!(temp&SysTick_CTRL_COUNTFLAG_Msk));
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;			//关闭滴答定时器
	SysTick->VAL = 0x00;								//将value值复位为0
}


/**
  * @brief  毫秒级别延时
  * @param  nms ：毫秒时间数(0-1864)  
  * @note 	由于只有24个位共3个字节用来存储预装载值（0-16777215）
  			所以nms的取值范围为0-(16777215/9000) --为-- 0-1864
  * @retval None
  */
void delay_ms(u16 nms)
{
	u32 temp;
	
	SysTick->LOAD 	= (u32)nms*fac_ms;					//设置预装载值
	SysTick->VAL 	= 0x00;								//设置初始值
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;				//开启滴答定时器
	do{
		temp = SysTick->CTRL;
	}
	while((temp&SysTick_CTRL_ENABLE_Msk)&&!(temp&SysTick_CTRL_COUNTFLAG_Msk));
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;			//关闭滴答定时器
	SysTick->VAL = 0x00;								//将value值复位为0
}

/******************* (C) COPYRIGHT 2022 华清-TONLY *************END OF FILE****/
